/* 
 * File:   pidflib.h
 * Author: aple
 *
 * Created on 20180420
 */

#ifndef PID_FLIB_H
#define	PID_FLIB_H

#include "stdint.h"

#ifdef	__cplusplus
extern "C" {
#endif	
	
typedef struct
{
    float        GAIN; //PI 比例增益
    float        TI;  //PI 积分时间[s]
}PI_CON_Type;

typedef struct
{
    //PID 控制器参数
    float        GAIN;  //PID 比例增益
    float        TI;    //PID 积分时间[s]
    float        TD;    //PID 微分时间[s]
} PID_CON_Type;

typedef struct
{
    //保存的控制器参数	PID 参数保存在此结构中。
    float        PFAC_SP; //= 1.0 ;   //用于设定值变化的比例因子[0..1]
    float        GAIN; //= 0.0 ;   //比例增益
    float        TI; //= 0.0 ;   //积分时间[s]
    float        TD; //= 0.0 ;   //微分时间[s]
    float        D_F; //= 5.0 ;   //微分因子pid->TD/TM_LAG (5..10)
    float        CON_ZONE; //= 100.0f ; //控制带打开
    unsigned char        CONZ_ON; //= FALSE ; //控制带
} PAR_SAVE_Type;

typedef struct {

    float    PV_IN;          //外部过程变量输入         直接连接到PID输入           PVPER_ON=0有效                          XXX-外部更新
    int      intPV_PER;      //IO格式的外部过程变量，规格化后连接到PID输入          PVPER_ON=1有效                          XXX-外部更新
    float    DISV;      //叠加在输出反馈上                                                                                  XXX-外部设定 
    unsigned char    INT_HPOS; //积分作用保持在正方向                                                                       XXX-外部设定                    
    unsigned char    INT_HNEG; //积分作用保持在负方向 在级联控制中，主控制器的INT_HNEG 互连到次级控制器的QLMN_LLM。         XXX-外部设定
    unsigned char    SELECT;      //调用PID 和脉冲发生器的选项                                                              XXX-外部设定
    float    PV;    //过程变量                                                                                              RRR-内部管理
    float    LMN;   //可调节变量	                                                                                        YYY-PID输出
    int    intLMN_PER;      //LMN的规格化输出                                                                               YYY-PID输出
    unsigned char    QPULSE; //输出脉冲信号 可调节变量的值是在QPULSE 输出端调制的输出脉冲宽度。                             YYY-输出
    unsigned char    QLMN_HLM; //达到可调节变量的上限 。当超过了上限时，通过QLMN_HLM 输出端进行指示。                       YYY-输出
    unsigned char    QLMN_LLM; //达到可调节变量的下限 。当超过了下限时，通过QLMN_LLM 输出端进行指示。                       YYY-输出
    unsigned char    QC_ACT;  //下一个循环周期，连续控制器继续工作
    //该参数指示在下一个块调用时是否执行连续控制器环节(只有当SELECT 具有数值0 或1 时才相关)。
    float    CYCLE;   //连续控制器的采样时间[秒]    每CYCLE秒钟，为可调节变量计算一个新值                                   XXX-外部设置
    //在此设置PID 算法的采样时间。调谐器在阶段1 中计算采样时间，然后将其输入到CYCLE 中。必须和两次调用之间的时间差相匹配
    float    CYCLE_P;  //脉冲发生器的采样时间[秒]    脉冲发生器周期                                                         XXX-外部设置
    //在该输入端，输入脉冲发生器环节的采样时间。FB 58“TCONT_CP”在阶段1 中计算采样时间，然后将其输入到CYCLE_P。
    float    SP_INT;   //内部设定值 “内部设定值”输入端用于指定一个设定值。                                                  XXX-外部更新     
    float    MAN;   //手动值    MAN_ON=1时有效                                                                              XXX-外部更新    
    unsigned char    COM_RST; //完全重启动	该块有一个初始化例行程序，当COM_RST 输入端被置位时执行该例行程序。              XXX-外部设置
    unsigned char    MAN_ON;   //手动操作打开, 中断控制回路。LMN = MAN。                                                    XXX-外部设置
    float    DEADB_W;   //死区宽度                                                                                          XXX-外部设置
    float    I_ITLVAL;  //手动积分 I_ITL_ON 打开时的 积分输出 LMN_I=I_ITLVAL                                                XXX-外部设置 
    float    LMN_HLM;   //可调节变量上限                                                                                    XXX-外部设置
    float    LMN_LLM;   //可调节变量下限                                                                                    XXX-外部设置
    float    PV_FAC;    //IO格式过程变量 intPV_PER 因子    PVPER_ON=1有效                                                   XXX-外部设置
    float    PV_OFFS;   //IO过程变量偏移量                PVPER_ON=1有效                                                    XXX-外部设置
    float    LMN_FAC;   //可调节变量intLMN_PER 规格化 因子                                                                  XXX-外部设置    
    float    LMN_OFFS;  //可调节变量intLMN_PER 规格化偏移量                                                                 XXX-外部设置
    float    PER_TM;   //脉冲发生器周期【秒】                                                                               XXX-外部设置
    float    P_B_TM;   //最小脉冲/断开时间[秒]                                                                              XXX-外部设置
    float    TUN_DLMN;  //用于过程激励的可调节变量增量                                                                      XXX-外部设置
    //用于控制器整定的过程激励来自于TUN_DLMN 上的设定值阶跃变化。
    unsigned char    PER_MODE;  //外围设备模式可以在这个开关上输入I/O 模块的类型。   PVPER_ON=1有效                       XXX-外部设置
    unsigned char    PVPER_ON; //IO格式过程变量打开                                                                       XXX-外部设置                                       
    unsigned char    I_ITL_ON; //手动积分    打开时积分输出分量 LMN_I=I_ITLVAL                                            XXX-外部设置 
    unsigned char    PULSE_ON; //脉冲发生器输出功能打开                                                                   XXX-外部设置 
    unsigned char    TUN_KEEP; //保持整定打开，只有当TUN_KEEP 变成FALSE时，工作模式才切换成自动。                         XXX-外部设置 
    float    ER;   //偏差信号  过程值偏差的阶跃信号                                                                       RRR-内部管理
    float    LMN_P;   //比例输出分量	 LMN= LMN_P+LMN_I+LMN_D                                                           RRR-内部管理  
    float    LMN_I;   //积分输出分量	 LMN= LMN_P+LMN_I+LMN_D                                                           RRR-内部管理
    float    LMN_D;   //微分输出分量	 LMN= LMN_P+LMN_I+LMN_D                                                           RRR-内部管理
    int    intPHASE;      //自整定的阶段 控制器整定的当前阶段在intPHASE 输出端指示(0..7)。                                RRR-内部管理
    int    intSTATUS_H;      //自整定的状态加热 在加热时，intSTATUS_H 指示搜索拐点的诊断值。                              RRR-内部管理
    int    intSTATUS_D;      //自整定的状态控制器设计	当加热时，intSTATUS_D 指示控制器设计的诊断值。                    RRR-内部管理
    unsigned char    QTUN_RUN; //整定已激活(intPHASE 2)整定已经开始，并仍然处于第2 阶段(定位拐点)。                       RRR-内部管理
    PI_CON_Type PI_CON;
    PID_CON_Type PID_CON;
    PAR_SAVE_Type PAR_SAVE; //启动整定时或（SAVE_PAR=1）保存当前参数，撤销（UNDO_PAR=1 且 MAN_ON=1）设置时恢复参数到系统中
    float    PFAC_SP;   //用于设定值变化的比例因子 0.0-1.0                                                               XXX-外部设置                                                          
    float    GAIN;   //比例增益                                                                                          XRR-外部设置或从PI_CON/PID_CON/PARSAVE加载
    float    TI;  //积分时间[秒]                                                                                         XRR-外部设置或从PI_CON/PID_CON/PARSAVE加载
    float    TD;  //微分时间[秒]                                                                                         XRR-外部设置或从PI_CON/PID_CON/PARSAVE加载
    float    D_F;   //微分因子                                                                                           XRR-外部设置或从PI_CON/PID_CON/PARSAVE加载
    float    CON_ZONE; //控制带    输入超出控制带时 LMN设置为上限或下限                                                  XRR-外部设置或从PI_CON/PID_CON/PARSAVE加载
    unsigned char    CONZ_ON; //控制带打开	CONZ_ON =TRUE 激活控制带。                                                   XRR-外部设置或从PI_CON/PID_CON/PARSAVE加载
    unsigned char    TUN_ON; //自整定打开                                                                                XXX-外部设置   
    //设置 TUN_ON = TRUE，准备整定控制器。控制器从阶段 0 切换到阶段 1
    //如果设置了TUN_ON=TRUE，则可调节变量被取平均，直到设定值发生阶跃变化或TUN_ST=TRUE 将可调节变量激励TUN_DLMN 激活。
    unsigned char    TUN_ST; //开始自整定                                                                                XXX-外部设置  
    //通过设置启动位 TUN_ST，执行整定可调节变量(LMN0 + TUN_DLMN) (阶段转变 1-> 2)
    //如果要使设定值在控制器整定期间在工作点上保持不变，则通过TUN_ST=1 来激活可调节变量发生大小为TUN_DLMN 的阶跃变化。
    unsigned char    UNDO_PAR; //撤消对控制器参数的更改     从PAR_SAVE恢复                                               XXX-外部设置       
    unsigned char    SAVE_PAR; //保存当前控制器参数         保存到PAR_SAVE                                               XXX-外部设置  
    unsigned char    LOAD_PID; //装载优化的PI/PID 参数  （MAN_ON同时为1时有效）   从PI_CON/PID_CON加载数据               XXX-外部设置  
    //根据PID_ON，从数据结构PI_CON 或PID_CON 中装载控制器参数GAIN、TI、TD (仅在手动模式MAN_ON=1中 )
    unsigned char    PID_ON;  //PID 模式打开  是否作为PI 控制器或PID                                                     XXX-外部设置      
    float    GAIN_P;   //过程比例增益，对于过程类型I来说，GAIN_P 趋向于被估计得低一些。                                  RRR-内部管理            
    float    TU;   //延迟时间[秒] 识别出的过程延迟。                                                                     RRR-内部管理 
    float    TA;   //恢复时间[秒]                                                                                        RRR-内部管理 
    //识别出的过程的系统时间常数。对于过程类型I 来说，TA 趋向于被估计得低一些。
    float    KIG;   //PV WITH 100 % LMN 变化的最大斜率GAIN_P = 0.01f * KIG * TA                               RRR-内部管理 
    float    N_PTN;   //处理顺序 该参数指定处理的执行顺序。也可以指定“非整数值”。 自整定过程类型              XXX-外部设置     
    float    TM_LAG_P;   //PTN 模型的时间常数[秒] (有效值只用于N_PTN >= 2)。                                  XXX-外部设置               
    float    T_P_INF;   //到拐点的时间[秒] 从过程激发到拐点所经历的时间。                                     RRR-内部管理 
    float    P_INF;   //拐点处的PV - PV0 从过程激发到拐点处，过程变量发生的变化。                             RRR-内部管理  
    float    LMN0;   //整定开始时的可调节变量   在阶段1 中检测(平均值)。                                      RRR-内部管理  
    float    PV0;   //整定开始时的过程值                                                                      RRR-内部管理  
    float    PVDT0;   //整定开始时PV 的变化率[1/s]  采用有符号数。                                            RRR-内部管理  
    float    PVDT;   //PV 的当前变化率[1/s] 采用有符号数。                                                    RRR-内部管理  
    float    PVDT_MAX;   //每秒钟PV 的最大变化率[1/s]   用于计算TU 和KIG。                                    RRR-内部管理  
    float    NOI_PVDT;   //PVDT_MAX 中的噪声比率，采用%形式 噪声的比例越高，控制参数的精度就越低(越不积极)。  RRR-内部管理  
    float    NOISE_PV;   //PV 中的绝对噪声  阶段1 中最大和最小过程变量的差值。                                RRR-内部管理  
    int    intFIL_CYC;      //过程变量取intFIL_CYC 个周期的平均值。intFIL_CYC 可以自动从1 增加到最大值1024。  RRR-内部管理 
    int    intPOI_CMAX;      //拐点后的最大周期数，只有在此时间过后，整定才结束。                             XXX-外部设置  
    int    intPOI_CYCL;      //拐点后的周期数                                                                 RRR-内部管理  
    int    intSctFil;
    float    srPv;
    float    srNoise;
    float    srPvdt2;
    float    srPvdtMax2;
    float    srNoise2;
    float    srPvOld2;
    int    intSiStatus;
    int    intSiSpDir;
    float    srTime;
    float    sPvOld;
    float    sSpOld;
    float    srPvMin;
    float    srPVsim;
    float    srEffDlmn;
    float    sInvAlt;   //上周期比例偏差值 
    float    sIanteilAlt;  //上周期积分值  
    float    sRestInt;   //上周期积分偏差量（浮点数计算偏差） 
    float    sRestDif;   //上周期微分偏差量（浮点数计算偏差） 
    float    sRueck;
    float    sLmn;     //上周期调节值
    float   spassPTm;
    float    sCycTmPass;
    float    sPTm;
    float    srOptLmn;
    unsigned char    sbOptLmn;
    unsigned char    sbConzOn;
    unsigned char   sbSpChange;  //设定值是否变化  
    unsigned char    sbReOpt;
    float    sLmnHlmOld;
    float   sLmnLlmOld;
    float    srDiffSp;
    long int    siTime;
    long int    siCycle;
    long int    siCycleP;
    int    intSiPulsFil;
    float    srPulsPv;
    float    srDPvdt;
    float    srDPvdt2;
    float    sNpInf;
    float    sCycleM;
    float    sGf11_30;
    float    sGf12_30;
    float    sGf21_30;
    float    sGf22_30;
    float    sPv0Sim_30;
    float    srPVsim3_30;
    float    srPVsim2_30;
    float    srPVsim1_30;
    float    srDelPvsim_30;
    float    sGf11_20;
    float    sGf12_20;
    float    sGf21_20;
    float    sGf22_20;
    float    sPv0Sim_20;
    float    srPVsim2_20;
    float    srPVsim1_20;
    float    srDelPvsim_20;
    float    sGf11_15;
    float    sGf12_15;
    float    sGf21_15;
    float    sGf22_15;
    float    sPv0Sim_15;
    float    srPVsim2_15;
    float    srPVsim1_15;
    float    srDelPvsim_15;
    //END_VAR
    //VAR_TEMP
    long int    tTime;//:         TIME ;
    long int    iTime;
    float    rDiff;
    //float    rDiff_int; //local variable 偏差临时量，用于判断是否超出控制带
    //float    Verstaerk;  //local variable
    //float    RueckDiff;  //local variable
    //float    RueckAlt;   //local variable
    float    dLmn;	  //调节量
    
    unsigned char    bLMNnew;
    unsigned char    bPulse;
    unsigned char    bConzOn;	 //控制带被执行
    float    rSeek;
    float    rPvDelt;
    float   rPvFil;
    float   rPV0;
    float    rPvdtOri;
    float    rPVsigned;
    float    rSpDelt;	 //设定点的变化
    float   tw_durch_tu;
    float    gf;
    float    koeff;
    float    rCycle;	//步进控制器的采样时间（s）
    //float    rTmLag;	//local variable//微分作用时间延时浮点值
    float    rDeltaI;	//积分值的变化
    float    rVal;
    float    rPvNew2;
    float    rNoiPvdt;
    float    rPvdtMax0;
    
    
    float    rPvdt;
    float    rPvdt2;
    float    rPvdt3;	 // srPvdt2 初始值
    int    intFilCyc;	 //内部：周期号为中值滤波
    int    intVal;
    float    rT1sim;	 //模拟时间常数
    float    rT2sim;	 //模拟时间常数
    float    rKsim;
    float    rSumHp;
    float    rSumLp;
    float    rHp;
    float    rLp;
    float    rNptn;	//通过模拟顺序确定
    float    rNptnHl;	//通过仿真上限决定的顺序
    float    rNptnLl;	//通过仿真下限确定的顺序

    //END_VAR
} SemPidType;
    
void SemPidInit(SemPidType *pid);
void SemPid(SemPidType *pid);


#ifdef	__cplusplus
}
#endif

#endif	/* PID_FLIB_H */
